#pragma once
#include "Common.h"

namespace TypeCast
{
    class A
    {
    public:
        virtual void f() {}
    };

    class B : public A
    {
    };

    void fun(A *pa)
    {
        // 将父类的指针转回子类
        // dynamic_cast会先检查是否能转换成功，能成功则转换，不能则返回
        B *pb1 = static_cast<B *>(pa);  // 不安全
        B *pb2 = dynamic_cast<B *>(pa); // 安全
        cout << "pb1:" << pb1 << endl;
        cout << "pb2:" << pb2 << endl;
    }

    void Test_TypeCast()
    {
        // reinterpret_cast
        typedef unsigned long long ULL;
        int *pi = reinterpret_cast<int *>(16);
        ULL ull = reinterpret_cast<ULL>(pi);
        cout << pi << " : " << ull << endl;
        cout << endl;

        // dynamic_cast
        A a;
        B b;
        // 分别传入父类对象和子类对象的地址
        fun(&a);
        fun(&b);
        cout << endl;
        A *paa = dynamic_cast<A *>(&a);
        B *pbb = dynamic_cast<B *>(&b);
        A *pba = dynamic_cast<A *>(&b);
        // B *pab = dynamic_cast<B *>(&a); // 父转子不能成功

        // B ab = dynamic_cast<B>(a); //多态继承体系中的指针或引用
        // A ba = dynamic_cast<A>(b);
        cout << "paa:" << paa << endl;
        cout << "pbb:" << pbb << endl;
        cout << "pba:" << pba << endl;
        // cout << "pab:" << pab << endl;
    }
}
